from fastapi import APIRouter, HTTPException, status

from app import services
from app.models import RecipeDBSchema, RecipeListSchema, RecipeSchema

router = APIRouter(prefix="/recipes", tags=["Рецепты"])


@router.get("/", response_model=list[RecipeListSchema])
async def get_recipes_list():
    """Получить список всех рецептов из базы данных.
    Сортировка по количеству просмотров (по убыванию) и времени приготовления (по возрастанию).
    """
    return await services.get_all()


@router.get("/{recipe_id}")
async def get_recipe(recipe_id: int):
    """Получить детальную информацию о рецепте по его `id`."""
    recipe = await services.get(recipe_id, increase_counter=True)
    if not recipe:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND, detail="Recipe not found"
        )
    return recipe


@router.post("/", response_model=RecipeDBSchema, status_code=status.HTTP_201_CREATED)
async def create_recipe(recipe: RecipeSchema):
    """Создать новый рецепт."""
    recipe_id = await services.create(recipe)
    return await services.get(recipe_id)


@router.patch("/{recipe_id}", response_model=RecipeDBSchema)
async def update_recipe(recipe_id: int, updated_recipe: RecipeSchema):
    """Изменить детальную информацию о рецепте по его `id`."""
    recipe = await services.get(recipe_id)
    if not recipe:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND, detail="Recipe not found"
        )

    await services.update(recipe_id, updated_recipe)
    return await services.get(recipe_id)


@router.delete("/{recipe_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_recipe(recipe_id: int) -> None:
    """Удалить рецепт по его `id`."""
    recipe = await services.get(recipe_id)
    if not recipe:
        raise HTTPException(status_code=404, detail="Recipe not found")

    await services.delete(recipe_id)
    return None
